<?

abstract class ModuleConfig {

	private $_data;

	public abstract function structure ();

	public abstract function filename ();

	public function get ($key = null) {
		if ($this->_data === null) $this->_data = require $this->filename();

		if ($key === null) {
			return $this->_data;
		} else if (!isset($this->_data[$key])) {
			$_data = $this->structure();
			if (!isset($_data[$key])) {
				trigger_error("Unknown key \"$key\"", E_USER_WARNING);
				return null;
			}
			if(isset($_data['dvalues'])){
				return $_data['dvalues'];
			} else if(isset($_data['dvalue'])){
				return $_data['dvalue'];
			} else{
				return null;
			}
		} else {
			return $this->_data[$key];
		}
	}

	public function set ($data) {
		foreach ($data as $k => $v) {
			$this->_data[$k] = $v;
		}
		return $this;
	}

	public function save () {
		$data = "<?php\nreturn " . var_export($this->_data, true) . ";";
		if (!file_put_contents($this->filename(), $data)) throw new Exception('Can`t save config file whith unknown reason');
		return $this;
	}

	private final function _test_structure () {
		return array(
			'name_int' => array(
				'label' => 'Число',
				'description' => 'Описание числа',
				'type' => 'int',
				'dvalue' => 123,
			),
			'name_text' => array(
				'label' => 'Текст',
				'description' => 'Описание текста',
				'type' => 'text',
				'dvalue' => "Это текст",
			),
			'name_checkbox' => array(
				'label' => 'Галочка',
				'description' => 'Описание галочки',
				'type' => 'checkbox',
			),
			'name_separator' => array(
				'label' => 'Разеделитель',
				'type' => 'separator',
			),
			'name_select' => array(
				'label' => 'Выпадающий список',
				'description' => 'Описание списка',
				'type' => 'select',
				'multiselect' => false,
				"dvalues" => 'value_1',
				"values" => array(
					'value_1' => 'Это значение текста 1',
					'value_2' => 'Это значение текста 2',
					'value_3' => 'Это значение текста 3',
					'optgroup_label' => array(
						'value_11' => 'Это значение текста 1.1',
						'value_12' => 'Это значение текста 2.2',
						'value_13' => 'Это значение текста 3.3',
					)
				),
			),
			'name_select' => array(
				'label' => 'Выпадающий список',
				'description' => 'Описание списка',
				'type' => 'select',
				'multiselect' => 15,
				"dvalues" => array(
					'value_1', 'value_3',
				),
				"values" => array(
					'value_1' => 'Это значение текста 1',
					'value_2' => 'Это значение текста 2',
					'value_3' => 'Это значение текста 3',
				)
			),
			'name_radio' => array(
				'label' => 'Радиокнопки',
				'description' => 'Описание радио',
				'type' => 'radio',
				"values" => array(
					'value_1' => 'Это значение текста 1',
					'value_2' => 'Это значение текста 2',
					'value_3' => 'Это значение текста 3',
				)
			),
		);
	}

}